import java.util.ArrayList;


public class ListaSincronizada<T> {
	private ArrayList<T> listaSync;
	private final int largoMaximo;
	private boolean apagar = false;
	
	public ListaSincronizada(int largo)
	{
		if (largo > 0)
		{
			this.listaSync = new ArrayList<T>(largo);
			this.largoMaximo = largo;
		} else {
			this.listaSync = new ArrayList<T>();
			this.largoMaximo = -1;
		}
	}
	
	public T get(int posicion)
	{
		return listaSync.get(posicion);
	}

	public int getLargo()
	{
		return listaSync.size();
	}
	
	public int getLargoMaximo() 
	{
		return largoMaximo;
	}
	
	public synchronized T sacar(int posicion)
	{
		if (posicion <= listaSync.size())
		{
			while (!apagar && listaSync.size() == 0)
			{
				try {
					this.wait(10000);
				} catch (InterruptedException e) {
				}
			}
			if(!apagar){
				T elemento = listaSync.get(posicion);
				listaSync.remove(posicion);
			
				this.notify();
				return elemento;
			}else{
				return null;
			}
		}
		return null;
	}
	
	public synchronized void insertar(T elemento)
	{
		if (largoMaximo > 0)
		{
			while (listaSync.size() == largoMaximo)
			{
				try {
					this.wait();
				} catch (InterruptedException e) {
				}
			}
		}
		listaSync.add(elemento);
		this.notify();
	}
	
	public boolean estaVacia()
	{
		return listaSync.isEmpty();
	}

	public void despertarParaTerminar() {
		apagar=true;
	}
		
}
